﻿using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Services;
using Web.Extensions;
using Web.Helpers;
using Web.Helpers.jqGridHelpers;

namespace Web.Pages
{
    public partial class Proyectos : BasePage
    {
        #region Events

        protected new void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);

            if (!Page.IsPostBack)
            {
                this.CargarPagina();
            }
        }

        #endregion Events

        #region Private Methods

        private void CargarPagina()
        {
            var currentUser = Helpers.SessionHelper.GetCurrentUser();
            if (currentUser == null)
                Helpers.SecurityHelper.RedirectUserToLoginPage();

            #region Lists binding

            var esAdmin = ValidarTipoUsuario(Common.WellKnownKeys.Entities.TiposUsuario.ADMINISTRADOR.Id, currentUser);

            var estadosGuion = EstadosGuion.ObtenerTodos();
            //if ( !esAdmin )
            //    estadosGuion = estadosGuion.Where(x => x.Id == WellKnownKeys.Entities.EstadosGuion.EN_GRABACION.Id).ToList();
            this.selEstadoGuion.Bind(estadosGuion, "Id", "Texto");

            var estadosPago = EstadosPago.ObtenerTodos();
            if (estadosPago.IsNotNull())
            {
                if ( !esAdmin )
                    estadosPago = estadosPago.Where(x => x.Id != WellKnownKeys.Entities.EstadosPago.PENDIENTE_DE_PAGO.Id).ToList();
            }
            this.selEstadoPago.Bind(estadosPago, "Id", "Texto");

            #endregion Lists binding

            this.ObtenerInfoReclamos();
        }

        private void ObtenerInfoReclamos()
        {
            var totalRecords = new StoredProcedure<Entidades.Calculado.TotalRecords>().GetList(WellKnownKeys.StoredProcedures.Reclamos_COUNT);
            if (totalRecords == null)
                return;

            var sb = new StringBuilder();
            foreach (var item in totalRecords)
            {
                sb.AppendFormat("<li>{0}: {1}</li>", item.Nombre, item.Count);
            }
            this.hdnInfoReclamos.Value = String.Format("<u>TOTAL:</u> {0}<ul>{1}</ul>", totalRecords.Sum(x => x.Count), sb.ToString());

            var sinAtender = totalRecords.FirstOrDefault(x => x.Id == Common.WellKnownKeys.Entities.EstadosReclamo.SIN_ATENDER.Id);
            this.lblReclamosSinAtender.InnerText = sinAtender != null ? sinAtender.Count.ToString() : "0";
        }

        #endregion Private Methods

        #region Web Methods

        [WebMethod]
        public static string obtenerProyectos(int pageSize, int currentPage, string sortColumn, string sortOrder, string search, string searchFilter, string colModel, bool isExport)
        {
            var jSON = string.Empty;
            try
            {
                var usuarioLogueado = SessionHelper.GetCurrentUser();
                if (usuarioLogueado == null)
                    return jSON;

                var parametros = GridDataHelper.GetParameters(searchFilter, colModel);
                    parametros.AddConditionalParameter("id_usuario", BasePage.ValidarPermisosAdmin(), DBNull.Value, usuarioLogueado.Id);

                var jqGridData = new Grid<Entidades.Calculado.ProyectoResumen>().GetGridData(WellKnownKeys.StoredProcedures.Proyectos_Listado_GET, parametros.List, currentPage, pageSize, BuildDataRows_Proyectos);

                jSON = Formatter.JSON<jqGridData>.Serialize(jqGridData);
            }
            catch (Exception ex)
            {
                LogError(ex);
                throw;
                //string detalleError = ex.Message;
                //jSON = Formatter.jSON.convertirEnJSON(new Helpers.jqGridHelpers.jqGridData(0, 0, 1, null));
            }
            return jSON;
        }

        [WebMethod]
        public static string obtenerGuiones(int pageSize, int currentPage, string sortColumn, string sortOrder, string search, string searchFilter, string colModel, bool isExport)
        {
            var jSON = string.Empty;
            try
            {
                var usuarioLogueado = SessionHelper.GetCurrentUser();

                var parametros = GridDataHelper.GetParameters(searchFilter, colModel);
                    parametros.AddParameter("id_guion_estado", null);
                    parametros.AddConditionalParameter("id_usuario", BasePage.ValidarPermisosAdmin(), DBNull.Value, usuarioLogueado.Id);

                var jqGridData = new Grid<Entidades.Calculado.GuionResumen>().GetGridData(WellKnownKeys.StoredProcedures.Guiones_Listado_GET, parametros.List, currentPage, pageSize, BuildDataRows_Guiones);

                jSON = Formatter.JSON<jqGridData>.Serialize(jqGridData);
            }
            catch (Exception ex)
            {
                LogError(ex);
                throw;
            }
            return jSON;
        }

        [WebMethod]
        public static string obtenerDetallePagos(int pageSize, int currentPage, string sortColumn, string sortOrder, string search, string searchFilter, string colModel, bool isExport)
        {
            var jSON = string.Empty;
            try
            {
                var ruleIdGuion  = new jqGridSearchFilterBuilder(searchFilter, colModel).GetMatchingRules("IdGuion");

                var activo          = true; //Common.Formatter.ToBoolean(ruleActivo.First().Data);
                var idEstadoPago    = DBNull.Value; //Convert.ToInt32(ruleEstadoPago.First().Data);
                var idEstadoGuion   = DBNull.Value; //Convert.ToInt32(ruleEstadoGuion.First().Data);
                var idProyecto      = DBNull.Value;
                var idGuion         = Convert.ToInt32(ruleIdGuion.First().Data);

                var usuarioLogueado = SessionHelper.GetCurrentUser();

                //var parametros = GridDataHelper.GetParameters(searchFilter, colModel);
                var parametros = new Common.Data.ParameterList();
                    parametros.AddParameter("@activo", activo);
                    parametros.AddParameter("@id_estado_guion", idEstadoGuion);
                    parametros.AddParameter("@id_estado_pago", idEstadoPago);
                    parametros.AddParameter("@id_proyecto", idProyecto);
                    parametros.AddParameter("@id_guion", idGuion);
                    parametros.AddConditionalParameter("@id_usuario", BasePage.ValidarPermisosAdmin(), DBNull.Value, usuarioLogueado.Id);

                var jqGridData = new Grid<Entidades.Calculado.PagoResumen>().GetGridData(WellKnownKeys.StoredProcedures.Pagos_Listado_GET, parametros.List, currentPage, pageSize, BuildDataRows_Pagos);

                jSON = Formatter.JSON<jqGridData>.Serialize(jqGridData);
            }
            catch (Exception ex)
            {
                LogError(ex);
                throw;
            }
            return jSON;            
        }

        #endregion Web Methods

        #region Private Methods

        private static IEnumerable<object[]> BuildDataRows_Proyectos(IList<Entidades.Calculado.ProyectoResumen> data)
        {
            var lista = from Entidades.Calculado.ProyectoResumen item in data
                        select new object[]
                        {
                            item.Id,
                            item.Activo,
                            BasePage.CrearBoton(WellKnownKeys.Grid.Actions.ACTIVAR, "Proyecto", item.Id, item.Activo ? WellKnownKeys.Images.Icons.HABILITADO : WellKnownKeys.Images.Icons.DESHABILITADO),
                            item.Activo ? BasePage.CrearBoton(WellKnownKeys.Grid.Actions.VER, "FacturacionProyecto", item.Id,WellKnownKeys.Images.Icons.LIQUIDACIONES) : String.Empty,
                            item.Activo ? BasePage.CrearBoton(WellKnownKeys.Grid.Actions.ELIMINAR, "Proyecto", item.Id,WellKnownKeys.Images.Icons.ELIMINAR): String.Empty,
                            BasePage.CrearLink(WellKnownKeys.Grid.Actions.EDITAR + "Proyecto", item.Id, Formatter.Text.ReducirTexto(item.Nombre, 40)),
                            item.Guiones,
                            item.GuionesEnGrabacion,
                            item.GuionesFinalizados,
                            item.CostoTotal,
                            item.CostoActores,
                            item.CostoTraductores,
                            item.CostoAdaptadores,
                            item.CostoEditores,
                            item.CostoOperadores,
                            item.CostoDirectores,
                            item.CostoMezcladores,
                            item.Duracion,
                            item.CostoMinuto
                        };
            return lista;
        }

        private static IEnumerable<object[]> BuildDataRows_Guiones(IList<Entidades.Calculado.GuionResumen> data)
        {
            var lista = from Entidades.Calculado.GuionResumen item in data
                        select new object[]
                        {
                            item.Id,
                            item.Activo,
                            BasePage.CrearBoton(WellKnownKeys.Grid.Actions.ACTIVAR, "Guion", item.Id, item.Activo ? WellKnownKeys.Images.Icons.HABILITADO : WellKnownKeys.Images.Icons.DESHABILITADO),
                            item.Activo ? BasePage.CrearBoton(WellKnownKeys.Grid.Actions.VER, "LiquidacionGuion", item.Id,WellKnownKeys.Images.Icons.LIQUIDACIONES) : String.Empty,
                            item.Activo ? BasePage.CrearBoton(WellKnownKeys.Grid.Actions.ELIMINAR, "Guion", item.Id, WellKnownKeys.Images.Icons.ELIMINAR) : String.Empty,
                            item.IdEstado,
                            item.IdProyecto,
                            //item.IdAdaptador,
                            //item.IdDirector,
                            //item.IdMezclador,
                            //item.IdTraductor,
                            BasePage.CrearLink(WellKnownKeys.Grid.Actions.EDITAR + "Guion", item.Id, Formatter.Text.ReducirTexto(item.Titulo, 40)),
                            item.Episodio,
                            DeterminarRolParticipacion(item.IdAdaptador, item.IdDirector, item.IdMezclador, item.IdTraductor),
                            item.Duracion,
                            item.Paginas,
                            item.Loops,
                            item.Personajes,
                            item.Estado,
                            BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "DetallePagos", item.Id, item.Pagos.ToString()),
                            BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "DetallePagos", item.Id, item.PagosPendientesDePago.ToString()),
                            BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "DetallePagos", item.Id, item.PagosPagados.ToString()),
                            //item.Pagos,
                            //item.PagosPendientesDePago,
                            //item.PagosPagados
                        };
            return lista;
        }

        private static IEnumerable<object[]> BuildDataRows_Pagos(IList<Entidades.Calculado.PagoResumen> data)
        {
            var lista = from Entidades.Calculado.PagoResumen item in data
                select new object[]
                {
                    item.Id,
                    item.IdPago,
                    item.IdGuion,
                    //item.IdProyecto,
                    //BasePage.CrearLink(WellKnownKeys.Grid.Actions.EDITAR + "Facturacion", item.IdProyecto, item.Proyecto),
                    //item.IdGuion,
                    //item.IdEstadoGuion,
                    //BasePage.CrearBoton("GenerarReclamo", String.Format("Guion_{0}", item.EstadoPago.RemoveWhitespaces("_")), item.IdGuion, WellKnownKeys.Images.Iconos.RECLAMAR),
                    //item.Episodio,
                    //BasePage.CrearLink(WellKnownKeys.Grid.Actions.EDITAR + "Guion", item.IdGuion, item.Titulo),
                    item.IdProveedor,
                    item.Proveedor, //BasePage.CrearLink(WellKnownKeys.Grid.Actions.VER + "Proveedor", item.IdProveedor, item.Proveedor),
                    item.ProveedorTipo,
                    //item.Loops,
                    //item.Canciones,
                    //item.ImporteLoops,
                    //item.ImporteCanciones,
                    item.ImporteTotal,
                    item.IdEstadoPago,
                    item.EstadoPago
                    //item.MedioPago,
                    //item.IdMedioPago,
                };
            return lista;
        }

        private static string DeterminarRolParticipacion(int idAdaptador, int idDirector, int idMezclador, int idTraductor)
        {
            var usuarioLogueado = SessionHelper.GetCurrentUser();
            int? idUsuario = null;
            if (usuarioLogueado.IdCategoria == WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id)
                idUsuario = usuarioLogueado.Id;

            var rol = String.Empty;

            if (idUsuario == null)
                return rol;

            if (idAdaptador == idUsuario.Value)
                rol = WellKnownKeys.Entities.TiposUsuario.ADAPTADOR.Nombre;
            if (idDirector == idUsuario.Value)
                rol = WellKnownKeys.Entities.TiposUsuario.DIRECTOR.Nombre;
            if (idMezclador == idUsuario.Value)
                rol = WellKnownKeys.Entities.TiposUsuario.MEZCLADOR.Nombre;
            if (idTraductor == idUsuario.Value)
                rol = WellKnownKeys.Entities.TiposUsuario.TRADUCTOR.Nombre;

            return rol;
        }

        #endregion Private Methods
    }
}